package br.com.edumobi.fragments;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;

import br.com.edumobi.P;
import br.com.edumobi.R;
import br.com.edumobi.adapters.ListaAlternativasAdapter;
import br.com.edumobi.dados.modelos.Alternativa;
import br.com.edumobi.dados.modelos.Questao;

public class MSQuestaoFragment extends GenericoFragment {

    private ImageView imageViewVoltarListaQuestoesMSQuestao;
    private TextView textViewNumeroQuestaoMSQuestao;
    private TextView textViewEnunciadoMSQuestao;
    private ListView listViewAlternativasMSQuestao;
    private Button buttonProximaMSQuestao;

    private AcoesMSQuestaoFragment activity;

    private List<Questao> questoes;
    private Long idAlternativaSelecionada;
    private Integer indexQuestao;
    private Integer sizeQuestoes;
    private boolean questaoVisualizadaRespondida;

    private AdapterView.OnItemClickListener clickItemlistViewAlternativasMSQuestao = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            idAlternativaSelecionada = id;
            carregarListViewAlternativas(questoes.get(indexQuestao).alternativas, idAlternativaSelecionada);
        }
    };

    private View.OnClickListener clickButtonProximaMSQuestao = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showComponents();

            buttonProximaMSQuestao.setVisibility(View.GONE);

            indexQuestao = getIndexProximaQuestao();
            idAlternativaSelecionada = null;
            questaoVisualizadaRespondida = false;

            if (indexQuestao == null) {
                activity.goResultado();
            } else {
                visualizarQuestao(questoes.get(indexQuestao));
            }
        }
    };

    private View.OnClickListener clickImageViewVoltarListaQuestoesMSQuestao = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            activity.goListaDeQuestoes();
        }
    };

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        activity = (AcoesMSQuestaoFragment) getActivity();

        questoes = activity.getQuestoes();
        sizeQuestoes = questoes.size();

        if (activity.getIndexQuestaoSelecionada() == P.INT_NULL) {
            if (indexQuestao == null) {
                indexQuestao = getIndexProximaQuestao();
            }
        } else {
            indexQuestao = activity.getIndexQuestaoSelecionada();
        }

        if (indexQuestao == null) {
            activity.goResultado();
        } else {
            visualizarQuestao(questoes.get(indexQuestao));
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_ms_questao, container, false);

        imageViewVoltarListaQuestoesMSQuestao = (ImageView) view.findViewById(R.id.imageViewVoltarListaQuestoesMSQuestao);
        textViewNumeroQuestaoMSQuestao = (TextView) view.findViewById(R.id.textViewNumeroQuestaoMSQuestao);
        textViewEnunciadoMSQuestao = (TextView) view.findViewById(R.id.textViewEnunciadoMSQuestao);
        listViewAlternativasMSQuestao = (ListView) view.findViewById(R.id.listViewAlternativasMSQuestao);
        buttonProximaMSQuestao = (Button) view.findViewById(R.id.buttonProximaMSQuestao);

        imageViewVoltarListaQuestoesMSQuestao.setOnClickListener(clickImageViewVoltarListaQuestoesMSQuestao);
        listViewAlternativasMSQuestao.setOnItemClickListener(clickItemlistViewAlternativasMSQuestao);
        buttonProximaMSQuestao.setOnClickListener(clickButtonProximaMSQuestao);

        if (questaoVisualizadaRespondida) {
            visualizarResposta();
        }

        return view;
    }

    @Override
    public void showComponents() {
        imageViewVoltarListaQuestoesMSQuestao.setVisibility(View.VISIBLE);
        textViewNumeroQuestaoMSQuestao.setVisibility(View.VISIBLE);
        textViewEnunciadoMSQuestao.setVisibility(View.VISIBLE);
        listViewAlternativasMSQuestao.setVisibility(View.VISIBLE);
        buttonProximaMSQuestao.setVisibility(View.VISIBLE);
    }

    @Override
    public void hideComponents() {
        imageViewVoltarListaQuestoesMSQuestao.setVisibility(View.GONE);
        textViewNumeroQuestaoMSQuestao.setVisibility(View.GONE);
        textViewEnunciadoMSQuestao.setVisibility(View.GONE);
        listViewAlternativasMSQuestao.setVisibility(View.GONE);
        buttonProximaMSQuestao.setVisibility(View.GONE);
    }

    private void visualizarQuestao(Questao questao) {
        textViewEnunciadoMSQuestao.setText(questao.enunciado);

        carregarListViewAlternativas(questao.alternativas, idAlternativaSelecionada);
    }

    private void visualizarResposta() {
        if (idAlternativaSelecionada != null) {

            hideComponents();
            buttonProximaMSQuestao.setVisibility(View.VISIBLE);

            questoes.get(indexQuestao).respondida = true;

            if (questoes.get(indexQuestao).alternativaCorreta.id.equals(idAlternativaSelecionada)) {
                questoes.get(indexQuestao).acertou = true;
            } else {
                questoes.get(indexQuestao).acertou = false;
            }

            activity.onSalvarResposta(questoes.get(indexQuestao));
        }
    }

    private void carregarListViewAlternativas(List<Alternativa> alternativas, Long idAlternativaSelecionada) {
        if (idAlternativaSelecionada != null) {
            listViewAlternativasMSQuestao.setAdapter(new ListaAlternativasAdapter(alternativas, idAlternativaSelecionada));
        } else {
            listViewAlternativasMSQuestao.setAdapter(new ListaAlternativasAdapter(alternativas));
        }
    }

    private Integer getIndexProximaQuestao() {
        if (indexQuestao == null) {
            for (int index = 0; index < sizeQuestoes; index++) {
                if (!questoes.get(index).respondida) {
                    return index;
                }
            }
        } else {
            if (indexQuestao + 1 >= sizeQuestoes) {
                for (int index = 0; index < sizeQuestoes; index++) {
                    if (!questoes.get(index).respondida) {
                        return index;
                    }
                }
            } else {
                if (!questoes.get(indexQuestao + 1).respondida) {
                    return indexQuestao + 1;
                }
            }
        }

        return null;
    }

    public interface AcoesMSQuestaoFragment extends AcoesGenericoFragment {
        List<Questao> getQuestoes();
        int getIndexQuestaoSelecionada();
        void onSalvarResposta(Questao questao);
        void goResultado();
        void goListaDeQuestoes();
    }
}